// magicCoinManager.js - 魔法币管理工具
// 提供单例模式的魔法币管理器
let instance = null;

// 导入存储管理器
const storageManager = require('./storageManager').getInstance();

/**
 * 魔法币管理器类
 * 负责用户魔法币的存储、获取、增加和减少操作
 */
class MagicCoinManager {
  constructor() {
    // 存储键名已移至storageManager.STORAGE_KEYS中统一管理
  }

  /**
   * 获取魔法币管理器的单例实例
   * @returns {MagicCoinManager} 魔法币管理器实例
   */
  static getInstance() {
    if (!instance) {
      instance = new MagicCoinManager();
    }
    return instance;
  }

  /**
   * 获取用户当前的魔法币数量
   * @returns {number} 当前魔法币数量
   */
  getMagicCoins() {
    try {
      const coins = storageManager.getStorage(storageManager.STORAGE_KEYS.USER_MAGIC_COINS);
      // 如果不存在，返回默认值0
      return coins !== undefined && coins !== null ? parseInt(coins, 10) : 0;
    } catch (error) {
      console.error('获取魔法币数量失败:', error);
      return 0;
    }
  }

  /**
   * 设置用户的魔法币数量
   * @param {number} amount - 要设置的魔法币数量
   * @returns {boolean} 是否设置成功
   */
  setMagicCoins(amount) {
    try {
      // 确保数量为非负数
      const validAmount = Math.max(0, parseInt(amount, 10) || 0);
      storageManager.setStorage(storageManager.STORAGE_KEYS.USER_MAGIC_COINS, validAmount);
      return true;
    } catch (error) {
      console.error('设置魔法币数量失败:', error);
      return false;
    }
  }

  /**
   * 增加用户的魔法币数量
   * @param {number} amount - 要增加的魔法币数量
   * @returns {boolean} 是否增加成功
   */
  addMagicCoins(amount) {
    try {
      // 确保增加的数量为正数
      const validAmount = Math.max(1, parseInt(amount, 10) || 1);
      const currentCoins = this.getMagicCoins();
      const newCoins = currentCoins + validAmount;
      return this.setMagicCoins(newCoins);
    } catch (error) {
      console.error('增加魔法币失败:', error);
      return false;
    }
  }

  /**
   * 减少用户的魔法币数量
   * @param {number} amount - 要减少的魔法币数量
   * @returns {boolean} 是否减少成功（余额不足时返回false）
   */
  reduceMagicCoins(amount) {
    try {
      // 确保减少的数量为正数
      const validAmount = Math.max(1, parseInt(amount, 10) || 1);
      const currentCoins = this.getMagicCoins();
      
      // 检查余额是否充足
      if (currentCoins < validAmount) {
        console.warn('魔法币余额不足');
        return false;
      }
      
      const newCoins = currentCoins - validAmount;
      return this.setMagicCoins(newCoins);
    } catch (error) {
      console.error('减少魔法币失败:', error);
      return false;
    }
  }

  /**
   * 消费魔法币
   * @param {number} amount - 要消费的魔法币数量
   * @returns {Object} {success: boolean, message: string}
   */
  spendMagicCoins(amount) {
    const success = this.reduceMagicCoins(amount);
    return {
      success: success,
      message: success ? `成功消费${amount}魔法币` : '魔法币余额不足'
    };
  }

  /**
   * 格式化魔法币数量显示
   * @param {number} amount - 魔法币数量
   * @returns {string} 格式化后的魔法币显示文本
   */
  formatMagicCoins(amount) {
    return `🪙 ${amount} 魔法币`;
  }

  /**
   * 检查任务是否已获得奖励
   * @param {string} taskId - 任务唯一标识
   * @returns {boolean} 是否已获得奖励
   */
  hasTaskRewardClaimed(taskId) {
    try {
      const claimedTasks = storageManager.getStorage(storageManager.STORAGE_KEYS.CLAIMED_TASK_REWARDS) || {};
      return claimedTasks[taskId] === true;
    } catch (error) {
      console.error('检查任务奖励状态失败:', error);
      return false;
    }
  }

  /**
   * 标记任务奖励为已领取
   * @param {string} taskId - 任务唯一标识
   * @returns {boolean} 是否标记成功
   */
  markTaskRewardAsClaimed(taskId) {
    try {
      const claimedTasks = storageManager.getStorage(storageManager.STORAGE_KEYS.CLAIMED_TASK_REWARDS) || {};
      claimedTasks[taskId] = true;
      storageManager.setStorage(storageManager.STORAGE_KEYS.CLAIMED_TASK_REWARDS, claimedTasks);
      return true;
    } catch (error) {
      console.error('标记任务奖励失败:', error);
      return false;
    }
  }

  /**
   * 重置每日任务奖励状态
   */
  resetDailyTaskRewards() {
    try {
      // 这个方法可以在每日凌晨由应用调用，重置所有任务奖励状态
      storageManager.removeStorage(storageManager.STORAGE_KEYS.CLAIMED_TASK_REWARDS);
    } catch (error) {
      console.error('重置任务奖励失败:', error);
    }
  }
}

// 导出类和单例实例
module.exports = {
  MagicCoinManager,
  // 直接导出单例实例
  getInstance: MagicCoinManager.getInstance
};

// 同时设置默认导出为单例实例
module.exports.default = MagicCoinManager.getInstance();